#if 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 函数声明
char *longestCommonPrefix(char **strs, int strsSize);

int main()
{
    char *strs[] = {"flower", "flow", "flight"};
    int strsSize = sizeof(strs) / sizeof(strs[0]);
    char *prefix = longestCommonPrefix(strs, strsSize);
    printf("The longest common prefix is: %s\n", prefix);
    return 0;
}

// 实现查找最长公共前缀的函数
char *longestCommonPrefix(char **strs, int strsSize)
{
    if (strsSize == 0)
        return ""; // 如果数组为空，返回空字符串

    char *prefix = strs[0]; // 假设第一个字符串为最长公共前缀
    for (int i = 1; i < strsSize; i++)
    {
        // 逐个字符比较当前prefix与strs[i]
        while (*prefix != '\0' && *strs[i] != '\0' && *prefix == *strs[i])
        {
            prefix++;  // 移动到下一个字符
            strs[i]++; // 移动到strs[i]的下一个字符
        }
        // 如果prefix已经到达末尾（即无公共前缀），则重置prefix并退出循环
        if (*prefix == '\0')
        {
            return "";
        }
        // 重置prefix和strs[i]的指针到它们各自的字符串开头，但prefix的实际内容要更新为比较后的结果
        prefix = strs[0];
        strs[i] -= (prefix - strs[0]); // 将strs[i]的指针移回它原来的起始位置，但已减去与prefix相同的字符数
    }

    // 此时prefix指向的是第一个字符串中最后一个公共前缀字符的下一个位置
    // 因此我们需要返回prefix之前（不包括prefix指向的字符）的字符串
    // 由于C语言字符串以'\0'结尾，我们可以直接通过修改prefix来实现这一点
    prefix--;                                           // 指向最后一个公共前缀字符
    char *result = (char *)malloc(strlen(strs[0]) + 1); // 分配足够的内存来存储结果
    if (result == NULL)
        return ""; // 内存分配失败

    // 复制公共前缀到result，并添加字符串结束符
    int j = 0;
    while (prefix >= strs[0] && *prefix != '\0')
    {
        result[j++] = *prefix--;
    }
    result[j] = '\0'; // 添加字符串结束符

    return result; // 返回动态分配的内存，注意调用者需要释放这块内存
}
#endif

#if 0
#include <stdio.h>
#include <string.h>  
  
// 注意：这个版本的函数不再返回字符串，而是直接在result中输出结果  
// 调用者需要确保result有足够的空间来存储结果  
void longestCommonPrefix(char** strs, int strsSize, char* result, int resultSize) {  
    if (strsSize == 0) {  
        result[0] = '\0'; // 如果数组为空，结果也为空字符串  
        return;  
    }  
  
    char* prefix = strs[0];  
    int len = 0; // 用于跟踪result中已写入的字符数  
  
    for (int i = 1; i < strsSize; i++) {  
        while (*prefix != '\0' && *strs[i] != '\0' && *prefix == *strs[i]) {  
            prefix++;  
            strs[i]++;  
            len++; // 公共前缀长度增加  
  
            // 检查result是否有足够的空间来存储当前的前缀  
            if (len >= resultSize - 1) {  
                // 如果没有足够空间，则截断并返回  
                result[resultSize - 1] = '\0';  
                return;  
            }  
        }  
  
        // 如果prefix已经到达末尾（即无公共前缀），则重置prefix并退出循环  
        if (*prefix == '\0') {  
            result[0] = '\0';  
            return;  
        }  
  
        // 重置prefix和strs[i]的指针到它们各自的字符串开头  
        // 但实际上在这个循环中我们不需要这样做，因为我们已经通过while循环移动了它们  
        // 这里只是为了说明，实际上可以省略  
  
        // 由于prefix和strs[i]已经移动，我们需要重置它们以进行下一次迭代  
        // 但在这个特定函数中，我们不需要显式地做这件事，因为我们在外层循环中处理  
    }  
  
    // 复制公共前缀到result（实际上在这个函数中，我们已经在循环中隐式地做了这件事）  
    // 但由于我们想要确保result以'\0'结尾，并且len可能由于空间限制而被截断  
    // 我们需要在这里显式地添加'\0'（如果还没有被截断的话）  
    if (len < resultSize) {  
        result[len] = '\0'; // 添加字符串结束符  
    } else {  
        // 如果len >= resultSize，则我们已经在之前添加了'\0'  
    }  
}  
  
int main() {  
    char* strs[] = {"flower","flow","flight"};  
    int strsSize = sizeof(strs) / sizeof(strs[0]);  
    char result[20]; // 假设这个数组足够大以存储结果  
    longestCommonPrefix(strs, strsSize, result, sizeof(result));  
    printf("The longest common prefix is: %s\n", result);  
    return 0;  
}
#endif